/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Matricula_Nota;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author Pedro
 */
public class Coordinador {

    private ArrayList<Seccion> secciones;
    private ArrayList<Area> areas;
    private ArrayList<Profesor> profesores;
    private ArrayList<Alumno> alumnos;

    public Coordinador() {
        areas = new ArrayList<Area>();
        secciones = new ArrayList<Seccion>();
        profesores = new ArrayList<Profesor>();
        alumnos = new ArrayList<Alumno>();
    }

    public ArrayList<Area> getAreas() {
        return areas;
    }

    public void registrarArea(String nombre) {
        if (buscarNombreArea(nombre) != null) {
            throw new RuntimeException("NOMBRE DE AREA YA REGISTRADO");
        }
        String codGen = "AR001";
        if (areas.size() > 0) {
            codGen = generarCodigo("AR", areas.get(areas.size() - 1).getCodigo());
        }
        Area area = new Area(codGen, nombre, 1);
        areas.add(area);
    }

    public void eliminarAreas(String codigo) {
        areas.remove(buscarAreas(codigo));
    }

    public void modificarArea(String codigo, String nombreNuevo) {
        if (buscarNombreArea(nombreNuevo) != null) {
            throw new RuntimeException("NOMBRE DE ÁREA YA EXISTE");
        }
        Area area = buscarAreas(codigo);
        area.setNombre(nombreNuevo);
    }

    public Area buscarAreas(String codigo) {
        for (Area area : areas) {
            if (area.getCodigo().equals(codigo)) {
                return area;
            }
        }
        return null;
    }

    public Area buscarNombreArea(String nombre) {
        for (Area area : areas) {
            if (area.getNombre().equals(nombre)) {
                return area;
            }
        }
        return null;
    }

    public void registrarCurso(String nombre, Area area) {
        if (buscarNombreCurso(nombre, area) != null) {
            throw new RuntimeException("CURSO YA REGISTRADO");
        }
        String codGen = "CU001";
        if (area.getCursos().size() > 0) {
            codGen = generarCodigo("CU", area.getCursos().get(area.getCursos().size() - 1).getCodigo());
        }
        Curso curso = new Curso(codGen, nombre, area, 1);
        ArrayList<Curso> cursosArr = area.getCursos();
        cursosArr.add(curso);
        area.setCursos(cursosArr);
    }

    public void modificarCurso(String codigo, String nuevoNombre, Area area) {
        Curso curso = buscarCurso(codigo, area);
        if (buscarNombreCurso(nuevoNombre, area) != null) {
            throw new RuntimeException("NOMBRE DE CURSO YA REGISTRADO");
        }
        curso.setNombre(nuevoNombre);
    }

    public void eliminarCurso(String codigo, Area area) {
        Curso curso = buscarCurso(codigo, area);
        curso.setEstado(0);
    }

    public Curso buscarCurso(String codigo, Area area) {
        for (Curso curso : area.getCursos()) {
            if (curso.getCodigo().equals(codigo)) {
                return curso;
            }
        }
        return null;
    }

    public Curso buscarNombreCurso(String nombre, Area area) {
        for (Curso curso : area.getCursos()) {
            if (curso.getNombre().equals(nombre)) {
                return curso;
            }
        }
        return null;
    }

    private int cursosAprobadoDesaprobado(Alumno alumno, String condicion) {
        int cant = 0;
        for (Nota nota : alumno.getNotas()) {
            if (nota.getCondicion().equals(condicion)) {
                cant++;
            }
        }
        return cant;
    }

    private String generarCodigo(String chrCod, String ultCod) {
        String codGen;
        String codAux = ultCod;
        int parteEnt = Integer.parseInt(codAux.substring(2, 5).toString());
        parteEnt++;
        codAux = "000" + String.valueOf(parteEnt);
        codGen = chrCod + codAux.substring(String.valueOf(parteEnt).length(), codAux.length());
        return codGen;
    }

    public void registrarProfesorCurso(Area area, Curso curso, Profesor profesor) {
        if (buscarProfesorCurso(curso, profesor) != null) {
            throw new RuntimeException("PROFESOR YA REGISTRADO");
        }
        ArrayList<Profesor> profeArr = curso.getProfesores();
        profeArr.add(profesor);
    }

    public ArrayList<Profesor> getProfesores() {
        return profesores;
    }

    /********* CODIGO INSERTADO POR MILAGROS *******************/
    public void registrarProfesor(String dni, String nombre, String apellido, String fnacimiento, String direccion,
            String telefono, String ecivil, String nacionalidad, String email, String profesion, int estado) {
        if (buscarProfesor(dni) != null) {
            throw new RuntimeException("PROFESOR YA REGISTRADO.");
        }
        //validaciones
        Pattern p = Pattern.compile("[^0-9]");
        Matcher m = p.matcher(dni);
//
        if (m.find() || dni.length() < 8) {
//        if (String.valueOf(dni).length() < 8) {
            throw new RuntimeException("DNI ERRADO, SOLO NUMEROS Y CON 8 DIGITOS.");
        }

        if (nombre.equals("")) {
            throw new RuntimeException("POR FAVOR INGRESA EL NOMBRE.");
        }

        if (apellido.equals("")) {
            throw new RuntimeException("POR FAVOR INGRESA LOS APELLIDOS.");
        }

        if (fnacimiento.equals("")) {
            throw new RuntimeException("POR FAVOR INGRESA LA FECHA DE NACIMIENTO.");
        }

        if (!isDate(fnacimiento)) {
            throw new RuntimeException("POR FAVOR INGRESE UNA FECHA VALIDA.");
        }

        if (direccion.equals("")) {
            throw new RuntimeException("POR FAVOR INGRESA LA DIRECCION.");
        }

        if (apellido.equals("")) {
            throw new RuntimeException("POR FAVOR INGRESA SUS APELLIDOS.");
        }

        if (email.equals("")) {
            throw new RuntimeException("POR FAVOR INGRESA EL EMAIL.");
        } else if (!isEmail(email)) {
            throw new RuntimeException("POR FAVOR CORRIGA EL MAIL.");
        }

        if (nacionalidad.equals("")) {
            throw new RuntimeException("POR FAVOR INGRESA LA NACIONALIDAD.");
        }

        if (profesion.equals("")) {
            throw new RuntimeException("POR FAVOR INGRESA LA PROFESION.");
        }

        // fin validaciones

        Profesor profesor = new Profesor(dni, nombre, apellido, fnacimiento, direccion, telefono, ecivil, nacionalidad, email, profesion, 1);
        profesores.add(profesor);
    }

    public void modificarProfesor(String dni, String nombre, String apellido, String fnacimiento, String direccion,
            String telefono, String ecivil, String nacionalidad, String email, String profesion, int estado) {

        //validaciones
        Pattern p = Pattern.compile("[^0-9]");
        Matcher m = p.matcher(dni);

        if (m.find() || dni.length() < 8) {
            throw new RuntimeException("DNI ERRADO, SOLO NUMEROS Y CON 8 DIGITOS.");
        }

        if (nombre.equals("")) {
            throw new RuntimeException("POR FAVOR INGRESA EL NOMBRE.");
        }

        if (apellido.equals("")) {
            throw new RuntimeException("POR FAVOR INGRESA LOS APELLIDOS.");
        }

        if (fnacimiento.equals("")) {
            throw new RuntimeException("POR FAVOR INGRESA LA FECHA DE NACIMIENTO.");
        }

        if (!isDate(fnacimiento)) {
            throw new RuntimeException("POR FAVOR INGRESE UNA FECHA VALIDA.");
        }

        if (direccion.equals("")) {
            throw new RuntimeException("POR FAVOR INGRESA LA DIRECCION.");
        }

        if (apellido.equals("")) {
            throw new RuntimeException("POR FAVOR INGRESA SUS APELLIDOS.");
        }

        if (email.equals("")) {
            throw new RuntimeException("POR FAVOR INGRESA EL EMAIL.");
        } else if (!isEmail(email)) {
            throw new RuntimeException("POR FAVOR CORRIGA EL MAIL.");
        }

        if (nacionalidad.equals("")) {
            throw new RuntimeException("POR FAVOR INGRESA LA NACIONALIDAD.");
        }

        if (profesion.equals("")) {
            throw new RuntimeException("POR FAVOR INGRESA LA PROFESION.");
        }
        // fin validaciones

        Profesor profesor = buscarProfesor(dni);
        profesor.setNombre(nombre);
        profesor.setApellido(apellido);
        profesor.setFnacimiento(fnacimiento);
        profesor.setDireccion(direccion);
        profesor.setTelefono(telefono);
        profesor.setEcivil(ecivil);
        profesor.setNacionalidad(nacionalidad);
        profesor.setProfesion(profesion);
        profesor.setEstado(1);
    }

    public void eliminarProfesor(String dni) {
        profesores.remove(buscarProfesor(dni));
    }

    public Profesor buscarProfesor(String dni) {
        for (Profesor profesor : profesores) {
            if (profesor.getDni().equals(dni)) {
                return profesor;
            }
        }
        return null;
    }

    /***************** FIN CODIGO  *******************/
    public Profesor buscarProfesorCurso(Curso curso, Profesor profesor) {
        for (Profesor profe : curso.getProfesores()) {
            if (profe.equals(profesor)) {
                return profe;
            }
        }
        return null;
    }

    //Código Insertado por Pedro Anaya, correspondiente a Secciónn y Horario
    public ArrayList<Seccion> getSecciones() {
        return secciones;
    }

    public void registrarSeccion(String nombre, String nivel, int grado, int periodo, int capacidad) {
        String codGen = "";
        if (secciones.size() > 0) {
            codGen = generarCodigo("SC", secciones.get(secciones.size() - 1).getCodigo());
        } else {
            codGen = "SC001";
        }
        Seccion seccion = new Seccion(codGen, nombre, nivel, grado, periodo, capacidad, 1);
        secciones.add(seccion);
    }

    public void registrarHorario(int dia, int hora, Seccion seccion, Curso curso, Profesor profesor) {
        if (buscarHorarioDiaHora(dia, hora, seccion) != null) {
            throw new RuntimeException("DIA Y HORA YA ESTA OCUPADO.");
        }
        String codGen = "HR001";
        if (seccion.getHorarios().size() > 0) {
            codGen = generarCodigo("HR", seccion.getHorarios().get(seccion.getHorarios().size() - 1).getCodigo());
        }
        Horario horario = new Horario(codGen, dia, hora, curso, profesor);
        ArrayList<Horario> horarios = seccion.getHorarios();
        horarios.add(horario);
        seccion.setHorarios(horarios);
    }

    public Horario buscarHorarioDiaHora(int dia, int hora, Seccion seccion) {
        for (Horario horario : seccion.getHorarios()) {
            if (horario.getHora() == hora && horario.getDia() == dia) {
                return horario;
            }
        }
        return null;
    }

    public void modificarSeccion(String codigo, String nombre, String nivel, int grado, int capacidad) {
        Seccion seccion = buscarSeccion(codigo);
        if (seccion != null) {
            seccion.setNombre(nombre);
            seccion.setNivel(nivel);
            seccion.setGrado(grado);
            seccion.setCapacidad(capacidad);
        }
    }

    public Seccion buscarSeccion(String codigo) {
        for (Seccion seccion : secciones) {
            if (seccion.getCodigo().equals(codigo)) {
                return seccion;
            }
        }
        return null;
    }

    public ArrayList<Seccion> buscarSeccionGraNiv(int grado, String nivel) {
        ArrayList<Seccion> listaSeccion = new ArrayList<Seccion>();
        for (Seccion seccion : secciones) {
            if (seccion.getNivel().equals(nivel) && seccion.getGrado() == grado) {
                listaSeccion.add(seccion);
            }
        }
        return listaSeccion;
    }

    public void eliminarSeccion(String codigo) {
        Seccion seccion = buscarSeccion(codigo);
        seccion.setEstado(0);
    }

    //---------codigo insertado por Jaime Guerrero, correspondiente a alumno
    public ArrayList<Alumno> getAlumnos() {
        return alumnos;
    }

    public void setAlumnos(ArrayList<Alumno> val) {
        this.alumnos = val;
    }

    //---------codigo insertado por Jaime Guerrero, correspondiente al registro de nota
    public ArrayList<Seccion> buscarSeccionPeriodo(int periodo) {
        ArrayList<Seccion> listaSeccion = new ArrayList<Seccion>();
        for (Seccion seccion : secciones) {
            if (seccion.getPeriodo() == periodo) {
                listaSeccion.add(seccion);
            }
        }
        return listaSeccion;
    }

    public ArrayList<Curso> getCursosSeccion(Seccion seccion) {
        ArrayList<Curso> cursos = new ArrayList<Curso>();
        for (Horario horario : seccion.getHorarios()) {
            if (!cursos.contains(horario.getCurso())) {
                cursos.add(horario.getCurso());
            }
        }
        return cursos;
    }

    public double calcularPromedioSeccion(Seccion seccion) {
        double promedio = 0.0;
        int numeroNotas=0;
        if (!seccion.getAlumnos().isEmpty()) {
            for (Alumno alumno : seccion.getAlumnos()) {
                for (Nota nota : alumno.getNotas()) {
                    promedio += nota.getNotaFinal();
                    numeroNotas++;
                }
            }
            promedio = promedio / numeroNotas;
        }
        return promedio;
    }

    public void registrarCalificacion(Alumno alumno, double practica1, double practica2,
            double examenParcial, double examenFinal, Seccion seccion, Curso curso, Profesor profesor) {
        if (getNotaCurso(alumno, seccion, curso) != null) {
            throw new RuntimeException("NOTA DEL CURSO YA REGISTRADA.");
        }
        Nota nota = new Nota(seccion, curso, profesor, practica1, practica2, examenParcial, examenFinal);
        nota.calcularNotaFinal();
        alumno.getNotas().add(nota);
    }

    public int obtenerCantidadCursosAprobados(Alumno alumno) {
        return cursosAprobadoDesaprobado(alumno, "APROBADO");
    }

    public int obtenerCantidadCursosDesaprobados(Alumno alumno) {
        return cursosAprobadoDesaprobado(alumno, "DESAPROBADO");
    }

    public static boolean isNumeric(String cadena) {
        try {
            Integer.parseInt(cadena);
            return true;
        } catch (NumberFormatException nfe) {
            return false;
        }
    }

    public boolean isNumeric2(String cadena) {
        try {
            Double.parseDouble(cadena);
            return true;
        } catch (NumberFormatException nfe) {
            return false;
        }
    }

    //-----------------------------------------------------------------------------
    /************MILAGROS ******************/
    //metodo para validar correo electronio
    private boolean isEmail(String email) {
        Pattern pat = null;
        Matcher mat = null;
        pat = Pattern.compile("^([0-9a-zA-Z]([_.w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-w]*[0-9a-zA-Z].)+([a-zA-Z]{2,9}.)+[a-zA-Z]{2,3})$");
        mat = pat.matcher(email);
        if (mat.find()) {
            System.out.println("[" + mat.group() + "]");
            return true;
        } else {
            return false;
        }
    }

    //metodo para validar la fecha de nacimiento
    public boolean isDate(String fnacimiento) {
        try {
            SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
            Date fecha = formatoFecha.parse(fnacimiento);
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    //Coduigo a generar por Fiorela
    public void registrarAlumno(String dni, String nombre, String fecha, String sexo,
            String nomApoderado, String ocupacApoderado,
            String distrito, String direccion, String telefono) {
        String codAlum, codModular = "";
        if (buscarAlumnoDni(dni) != null) {
            throw new RuntimeException("ALUMNO YA REGISTRADO EN LA LISTA");
        }


        if (String.valueOf(dni).length() < 8) {
            throw new RuntimeException("DNI ERRADO, SOLO NUMEROS Y CON 8 DIGITOS.");
        }


        if (nombre.equals("")) {
            throw new RuntimeException("POR FAVOR INGRESA EL NOMBRE Y APELLIDO.");
        }


        if (fecha.equals("")) {
            throw new RuntimeException("POR FAVOR INGRESA LA FECHA VALIDA.");
        }

        if (!isDate(fecha)) {
            throw new RuntimeException("POR FAVOR INGRESE UNA FECHA VALIDA.");
        }

        if (sexo.equals("Seleccione")) {
            throw new RuntimeException("POR FAVOR SELECCIONE UN SEXO.");
        }

        if (nomApoderado.equals("")) {
            throw new RuntimeException("POR FAVOR INGRESE NOMBRE DEL APODERADO.");
        }

        if (ocupacApoderado.equals("")) {
            throw new RuntimeException("POR FAVOR INGRESE OCUPACION DEL APODERADO.");
        }

        if (telefono.equals("")) {
            throw new RuntimeException("POR FAVOR INGRESE TELEFONO.");
        }

        if (direccion.equals("")) {
            throw new RuntimeException("POR FAVOR INGRESE DIRECCION.");
        }

        if (alumnos.size() > 0) {
            codAlum = generarCodigo("AL", alumnos.get(alumnos.size() - 1).getCodigo());
        } else {
            codAlum = "AL001";
        }

        Alumno objAlumnos = new Alumno(codAlum, dni, nombre, fecha, sexo, nomApoderado, ocupacApoderado, distrito, direccion, telefono, 1);
        alumnos.add(objAlumnos);
    }

    public Alumno buscarAlumnoDni(String dni) {
        for (Alumno alumno : alumnos) {
            if (alumno.getDni().equals(dni)) {
                return alumno;
            }
        }
        return null;
    }

    public Alumno buscarAlumno(String codigo) {
        for (Alumno alumno : alumnos) {
            if (alumno.getCodigo().equals(codigo)) {
                return alumno;
            }
        }
        return null;
    }

    public void ModificaAlumno(String codigo, String dni, String nombre, String fecha, String sexo, String nomApoderado, String ocupApoderado, String distrito, String direcc, String telefono) {
        Alumno alumno = buscarAlumno(codigo);
        alumno.setDni(dni);
        alumno.setNombre(nombre);
        alumno.setFecha(fecha);
        alumno.setSexo(sexo);
        alumno.setNomApoderado(nomApoderado);
        alumno.setOcuApoderado(ocupApoderado);
        alumno.setDistrito(distrito);
        alumno.setDireccion(direcc);
        alumno.setTelefono(telefono);
    }

    public void EliminarRegistro(Alumno objAlumno) {
        objAlumno.setEstado(0);
    }

    public void registrarMatricula(Alumno alumno, String fecha, Seccion seccion) {
        if (buscarAlumnoEnSeccion(alumno, seccion) != null) {
            throw new RuntimeException("ALUMNO YA REGISTRADO EN LA SECCION " + seccion.getNombre().toUpperCase());
        }
        String codGen = "MA001";
        if (alumno.getMatriculas().size() > 0) {
            codGen = generarCodigo("MA", alumno.getMatriculas().get(alumno.getMatriculas().size() - 1).getCodigo());
        }
        Matricula matricula = new Matricula(codGen, alumno, fecha, 1);
        alumno.getMatriculas().add(matricula);
        ArrayList<Alumno> listAlum = seccion.getAlumnos();
        listAlum.add(alumno);
        seccion.setAlumnos(listAlum);
    }

    public Matricula buscarCodigoAlumno(String codigo, Alumno alumno) {
        for (Matricula matricula : alumno.getMatriculas()) {
            if (matricula.getCodigo().equals(codigo)) {
                return matricula;
            }
        }
        return null;
    }

    private Alumno buscarAlumnoEnSeccion(Alumno alumno, Seccion seccion) {
        for (Alumno alumnoReg : seccion.getAlumnos()) {
            if (alumnoReg.equals(alumno)) {
                return alumnoReg;
            }
        }
        return null;
    }

    public Profesor getProfesorCurso(Seccion seccion, Curso curso) {
        for (Horario horario : seccion.getHorarios()) {
            if (horario.getCurso().equals(curso)) {
                return horario.getProfesor();
            }
        }
        return null;
    }

    public Nota getNotaCurso(Alumno alumno, Seccion seccion, Curso curso) {
        for (Nota nota : alumno.getNotas()) {
            if (nota.getSeccion().equals(seccion) && nota.getCurso().equals(curso)) {
                return nota;
            }
        }
        return null;
    }

    public void modificarCalificacion(Alumno alumno, double practica1, double practica2,
            double examenParcial, double examenFinal, Seccion seccion, Curso curso, Profesor profesor) {
        Nota nota = getNotaCurso(alumno, seccion, curso);
        nota.setPractica1(practica1);
        nota.setPractica2(practica2);
        nota.setExParcial(examenParcial);
        nota.setExFinal(examenFinal);
        nota.calcularNotaFinal();
    }
}
